package com.starhub.common.security.util;

import java.util.regex.Pattern;

/**
 * SQL注入检测工具类
 * @version: V1.0
 * @author: liuhf
 * @time 2025-06-06
 */
public class SqlInjectionUtil {
    
    /**
     * SQL注入风险关键字
     */
    private static final String[] SQL_INJECTION_KEYWORDS = {
        "select", "update", "delete", "insert", "drop", "truncate", 
        "exec", "execute", "union", "create", "alter", "declare",
        "--", "/*", "*/", ";", "@@", "@", "char", "nchar",
        "varchar", "nvarchar", "table", "database", "into"
    };

    /**
     * SQL注入风险特殊字符正则表达式
     */
    private static final Pattern SPECIAL_CHARS_PATTERN = Pattern.compile("[';\\\\%&]");

    /**
     * 检查是否存在SQL注入风险
     * @param value 要检查的值
     * @return true-存在风险 false-不存在风险
     */
    public static boolean containsSqlInjection(String value) {
        if (value == null || value.trim().isEmpty()) {
            return false;
        }

        // 转换为小写进行检查
        String lowerValue = value.toLowerCase();

        // 检查SQL关键字
        for (String keyword : SQL_INJECTION_KEYWORDS) {
            if (lowerValue.contains(keyword)) {
                return true;
            }
        }

        // 检查特殊字符
        return SPECIAL_CHARS_PATTERN.matcher(value).find();
    }

    /**
     * 检查对象中的所有字符串属性是否存在SQL注入风险
     * @param obj 要检查的对象
     * @return true-存在风险 false-不存在风险
     */
    public static boolean containsSqlInjection(Object obj) {
        if (obj == null) {
            return false;
        }

        // 如果是字符串，直接检查
        if (obj instanceof String) {
            return containsSqlInjection((String) obj);
        }

        // 如果是数组，检查每个元素
        if (obj.getClass().isArray()) {
            Object[] array = (Object[]) obj;
            for (Object item : array) {
                if (item instanceof String && containsSqlInjection((String) item)) {
                    return true;
                }
            }
        }

        return false;
    }
} 